/**
 * vector 方法测试
 */
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

std::vector<int> init_vector();

void print_vector(const vector<int> &vec);

int main()
{
    // 初始化数组
    vector<int> init_vec = init_vector();
    print_vector(init_vec);
    // 返回第一个数据O(1)
    int first_data = init_vec.front();
    std::cout << first_data << std::endl;
    // 返回数组中的最后一个数据 O(1)
    int last_data = init_vec.back();
    std::cout << last_data << std::endl;
    // 删除最后一个数据 O(1)
    init_vec.pop_back();
    print_vector(init_vec);
    // 在尾部加一个数据 O(1)
    init_vec.push_back(10);
    print_vector(init_vec);
    // 返回实际数据个数（unsigned类型）O(1)
    unsigned int size = init_vec.size();
    std::cout << size << std::endl;
    // 清除元素个数O(N),N为元素个数
    init_vec.clear();
    print_vector(init_vec);
    // 改变数组大小为 n, n个空间数值赋为 v，如果没有默认赋值为 0
    init_vec.resize(10, 1);
    print_vector(init_vec);
    // 向任意迭代器 it插入一个元素 x ，O(N)
    init_vec.insert(init_vec.begin() + 5, 10);
    print_vector(init_vec);
    // 删除 [first,last) 的所有元素，O(N)
    init_vec.erase(init_vec.begin() + 5, init_vec.end());
    print_vector(init_vec);
    // 返回首元素的迭代器（通俗来说就是地址）O(1)
    auto iterator_begin = init_vec.begin();
    // 返回最后一个元素后一个位置的迭代器（地址）O(1)
    auto iterator_end = init_vec.end();
    // 判断是否为空，为空返回真，反之返回假 O(1)
    bool flag = init_vec.empty();
    if (flag)
        std::cout << "empty" << std::endl;
    else
        std::cout << "not empty" << std::endl;

    // 对[1, n]区间进行从小到大排序
    sort(init_vec.begin(), init_vec.end());
    print_vector(init_vec);
    return 0;
}

vector<int> init_vector()
{
    vector<int> init_vec{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    return init_vec;
}

void print_vector(const vector<int> &vec)
{
    for (const auto &c: vec)
        std::cout << c << " ";
    std::cout << std::endl;
}